#include<iostream>
#include<cstring>
using namespace std;

int next1[1000005];
int next2[1000005];
int ans[1000005];

// 构建 next 数组，用于前缀匹配
void buildNext(char *d) {
    next1[0] = -1;
    int k = -1;
    int len = strlen(d);
    for (int j = 0; j < len; j++) {
        // KMP算法，构建next数组
        while (k >= 0 && d[k] != d[j]) {
            k = next1[k];
        }
        k++;
        next1[j + 1] = k;
    }
}
// 构建反转字符串的 next 数组，并返回最大匹配值
int buildNext1(char *d, int len) {
    next2[0] = -1;
    int maxn = 0;
    int k = -1;
    for (int j = 0; j < len; j++) {
        // KMP算法，构建next数组
        while (k >= 0 && d[k] != d[j]) {
            k = next2[k];
        }
        k++;
        next2[j + 1] = k;
        if (k > maxn) maxn = k; // 记录最大匹配长度
    }
    return maxn;
}

char a[2000050]; // 输入字符串
char b[2000005]; // 反转字符串

int main() {
    int js = 0; // 用于记录输入的行数
    string input; // 用来读取包含空格的整行输入
    
    // 使用 getline 来读取每行输入，包括空格
    while (1) {
        getline(cin, input);
        if (input.empty()) continue; // 跳过空行
        js++;
        strcpy(a, input.c_str()); // 将输入的字符串复制到字符数组 'a' 中
        int len = strlen(a);
        // 反转字符串
        // for (int i = 0; i < len; i++) {
        //     b[i] = a[len - i - 1];
        // }
        reverse(input.begin(),input.end());//反转字符串
        strcpy(b,input.c_str());//拷贝
         // 确保反转后的字符串以 '\0' 结束
        int ans1 = buildNext1(b, len); // 处理反转字符串
        buildNext(a); // 处理原始字符串
        int ans2 = len;
        // 获取最长相等前后缀的长度
        int longestPrefixSuffix = next1[len];
        if (longestPrefixSuffix > 0) {
            int secondLongestPrefixSuffix = next1[longestPrefixSuffix];
            if (secondLongestPrefixSuffix >= 0) {
                ans2 = len - 2 * secondLongestPrefixSuffix; // 计算最短调整后的长度
            }
        }
        ans[js] = ans1 + ans2;
     // 计算结果 X
    }
    // 输出每行结果
    for (int i = 1; i <= js; i++) {
        cout << ans[i] << endl; // 输出每个结果后换行
    }
    return 0;
}
